package com.jialiang.common.model;

import com.jialiang.common.constants.BaseEnum;
import com.jialiang.common.constants.CodeEnum;
import com.jialiang.common.exception.BusinessException;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Setter;

import java.io.Serializable;
import java.util.Objects;


@Data
public final class JsonObject<E> implements Serializable {

  @Setter(AccessLevel.PRIVATE)
  private Integer code;
  @Setter(AccessLevel.PRIVATE)
  private String message;
  @Setter(AccessLevel.PRIVATE)
  private E data;

  private JsonObject() {
  }

  /**
   * 生成表示"成功"的响应对象
   *
   * @return 表示"成功"的响应对象
   */
  public static JsonObject<?> success() {
    return success(null);
  }

  /**
   * 生成表示"成功"的响应对象，此对象中将包含响应到客户端的数据
   *
   * @param data 响应到客户端的数据
   * @return 表示"成功"的响应对象
   */
  public static <E> JsonObject<E> success(E data) {
    JsonObject<E> jsonObject = new JsonObject<>();
    jsonObject.setCode(CodeEnum.Success.getCode());
    jsonObject.setMessage(CodeEnum.Success.getName());
    jsonObject.setData(data);
    return jsonObject;
  }

  public static <E> JsonObject<E> success(E data, String msg) {
    JsonObject<E> jsonObject = success(data);
    jsonObject.setMessage(msg);
    return jsonObject;
  }

  public static JsonObject<?> fail(BaseEnum<?> codeEnum) {
    JsonObject<?> jsonObject = new JsonObject<>();
    jsonObject.setMessage(codeEnum.getName());
    jsonObject.setCode(codeEnum.getCode());
    return jsonObject;
  }

  public static JsonObject<?> fail(String msg) {
    JsonObject<?> jsonObject = new JsonObject<>();
    jsonObject.setMessage(msg);
    jsonObject.setCode(CodeEnum.Fail.getCode());
    return jsonObject;
  }

  public static <E> JsonObject<E> fail(E e, String msg) {
    JsonObject<E> jsonObject = new JsonObject<>();
    jsonObject.setCode(CodeEnum.Fail.getCode());
    jsonObject.setMessage(msg);
    jsonObject.setData(e);
    return jsonObject;
  }

  public static <E> JsonObject<E> res(BaseEnum<?> codeEnum, E e) {
    JsonObject<E> jsonObject = new JsonObject<>();
    jsonObject.setMessage(codeEnum.getName());
    jsonObject.setCode(codeEnum.getCode());
    jsonObject.setData(e);
    return jsonObject;
  }


  /**
   * 生成表示"失败"的响应对象
   *
   * @param serviceCode 业务状态码
   * @param message     提示文本
   * @return 表示"失败"的响应对象
   */
  public static JsonObject<?> fail(BaseEnum<?> serviceCode, String message) {
    JsonObject<?> jsonObject = new JsonObject<>();
    jsonObject.code = serviceCode.getCode();
    jsonObject.message = message;
    return jsonObject;
  }

  /**
   * 生成表示"失败"的响应对象
   *
   * @param e 业务异常
   * @return 表示"失败"的响应对象
   */
  public static JsonObject<?> fail(BusinessException e) {
    return fail(e.getServiceCode().getCode(),e.getMessage());
  }

  public boolean isSuccess() {
      return Objects.equals(CodeEnum.Success.getCode(), this.getCode());
  }

}
